﻿#pragma once
#ifndef LIST_RADIX_SORT_H
#define LIST_RADIX_SORT_H

#include <ossList.h>

OSS_EXTERN_BEG
/************************************************************************/
/*							基于双向循环链表的基数排序					 */
/************************************************************************/

/*
*			基数获取函数
*	@note  可自定义从高位，低位开始。借助OssContainerOf宏得到对应数据
*	@node  数据结构体
*	@num	权重，例如：十进制，i=0时，最高位数字，为1时计算的为次高位的数字
*			必须从高位到低位
*	return 返回计算的基数,若没有i位则返回-1
*/
typedef int(*OssRadixSortListGetDigital)(OssListNode* node,int num);
typedef int(*OssRadixSortListGetDigitalEx)(OssListNode* node,int num,void* pUserData);

/*
*			基于osslist的基数排序
*	@note	要求必须在数据结构中使用osslistnode node,
*	@L		链表头，从链头下一位开始排序
*	@radix	比较的进制，如十进制时，radix = 10，字符比较时 radix = 256
*	@getdigital 基数获取函数
*/
Bool OssRadixSortList(OssListNode *L,int radix, OssRadixSortListGetDigital getdigital);

/**
 *		基于256进制的基数排序，使用递归的方法，
 *	@note	要求必须在数据结构中使用osslistnode node,
 *	@L		链表头，从链头下一位开始排序
 *	@getdigital 基数获取函数,radix = 256
 *@return		成功返回TRUE
 *				否则返回FALSE
 *@notes R:recursion
 */
Bool OssRadixSortR256(OssListNode *L, OssRadixSortListGetDigital getdigital);
Bool OssRadixSortR256Ex(OssListNode *L, OssRadixSortListGetDigitalEx getdigital,void* pUserData);

OSS_EXTERN_END
#endif